<!DOCTYPE HTML>
<html>
<head>
<title>BlockInput | AutoHotkey</title>
<meta name="description" content="The BlockInput command disables or enables the user's ability to interact with the computer via keyboard and mouse." />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>BlockInput</h1>

<p>禁用或启用用户通过键盘和鼠标与计算机交互的能力.</p>

<pre class="Syntax"><span class="func">BlockInput</span>, OnOff
<span class="func">BlockInput</span>, SendMouse
<span class="func">BlockInput</span>, MouseMove  <em>; <span class="ver">[v1.0.43.11+]</span></em></pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>OnOff</dt>
  <dd>
    <p>此模式无条件地阻塞所有用户输入. 指定下列单词的其中一个:</p>
    <p><strong>On</strong>: 阻止用户与计算机交互(鼠标和键盘输入都无效).</p>
    <p><strong>Off</strong>: 重新启用输入.</p>
    <p><span class="ver">[v1.1.30+]:</span> 可以分别使用十进制值 1 和 0 代替 On 和 Off.</p>
  </dd>
  <dt>SendMouse</dt>
  <dd>
    <p>此模式仅在执行特定的发送和/或鼠标命令时阻塞用户输入. 指定下列单词的其中一个:</p>
    <p><strong>Send</strong>: 正在执行 <a href="Send.htm">Send</a> 或 <a href="Send.htm">SendRaw</a> 命令(仅对于传统的 <a href="SendMode.htm">SendEvent 模式</a>) 时, 用户的键盘和鼠标输入被忽略. 这样避免了用户的键击扰乱模拟键击流. 当 Send 结束时, 会重新启用输入(在之前没有使用 <code>BlockInput On</code> 阻塞的情况下).</p>
    <p><strong>Mouse</strong>: 正在执行 <a href="Click.htm">Click</a>, <a href="MouseMove.htm">MouseMove</a>, <a href="MouseClick.htm">MouseClick</a> 或 <a href="MouseClickDrag.htm">MouseClickDrag</a> 命令(仅对于传统的 <a href="SendMode.htm">SendEvent 模式</a>) 时, 用户的键盘和鼠标输入被忽略. 这样避免了用户的鼠标移动和点击扰乱模拟鼠标事件. 当鼠标命令结束时, 会重新启用输入(在之前没有使用 <code>BlockInput On</code> 阻塞的情况下).</p>
    <p><strong>SendAndMouse</strong>: 上面两种模式的组合.</p>
    <p><strong>Default</strong>: 同时关闭 <em>Send</em> 和 <em>Mouse</em> 模式, 但不改变输入阻塞的当前状态. 例如, 如果 <code>BlockInput On</code> 当前有效, 那么使用 <code>BlockInput Default</code> 不会关闭它.</p>
  </dd>
  <dt id="MouseMove">MouseMove <span class="ver">[v1.0.43.11+]</span></dt>
  <dd>
    <p>此模式仅阻止鼠标光标移动. 指定下列单词的其中一个:</p>
    <p><strong>MouseMove</strong>: 鼠标光标不会随用户对鼠标的物理移动而移动(DirectInput 应用程序可能是个例外). 脚本中首次使用此命令时, 会安装<a href="_InstallMouseHook.htm">鼠标钩子</a>(在还没有安装时). 同时, 脚本变成<a href="_Persistent.htm">持续运行的</a>, 这意味着应该使用 <a href="ExitApp.htm">ExitApp</a> 结束脚本. 鼠标钩子会一直保持加载状态, 直到下一次使用 <a href="Suspend.htm">Suspend</a> 或 <a href="Hotkey.htm">Hotkey</a> 命令, 此时如果没有任何热键或热字串需要那么它会被移除(请参阅 <a href="_Hotstring.htm">#Hotstring NoMouse</a>).</p>
    <p><strong>MouseMoveOff</strong>: 允许用户移动鼠标光标.</p>
  </dd>

</dl>

<h2 id="Remarks">备注</h2>
<p>所有这三种 BlockInput 模式(<em>OnOff</em>, <em>SendMouse</em> 和 <em>MouseMove</em>) 都是独立运行的. 例如, <code>BlockInput On</code> 会继续阻塞输入直到使用了 <code>BlockInput Off</code>, 即使 <em>SendMouse</em> 中的一个单词也有效. 另一个例子是, 如果 <code>BlockInput On</code> 和 <code>BlockInput MouseMove</code> 都有效, 鼠标移动将被阻塞, 直到它们都被关闭.</p>
<p class="note"><strong>注意:</strong> <em>OnOff</em> 和 <em>SendMouse</em> 模式将在 UAC 开启或脚本不是以管理员权限运行的时候失效. 更多详情, 请参阅 <a href="../FAQ.htm#uac">FAQ</a>.</p>
<p>比起 BlockInput, 通常优先考虑使用 <code><a href="SendMode.htm">SendMode</a> Input</code> 或 <code><a href="SendMode.htm">SendMode</a> Play</code> 会更好, 这样键击和鼠标点击会变得不可中断. 因为它们与 BlockInput 不一样, 这些模式不会丢弃发送期间用户输入的内容; 相反, 这些键击被缓冲起来在之后发送. 不使用 BlockInput 也避免了下文所描述的需要解决的粘滞按键问题.</p>
<p>如果在用户按住按键时启用 BlockInput, 可能会导致这些键 "卡住". 通过等待这些按键释放后才启用 BlockInput 可以避免此问题, 如本例所示:</p>
<pre>^!p::
KeyWait Control  <em>; 等待按键释放.  为每个热键修饰符使用一次 KeyWait 命令.</em>
KeyWait Alt
BlockInput On
<em>; ... 发送键击和鼠标点击 ...</em>
BlockInput Off
return</pre>
<p>每当发送 <kbd>Alt</kbd> 事件时, 输入阻塞会自动和临时禁用(之后重新启用).</p>
<p>BlockInput 生效时, 用户的输入被拦截, 不过 AutoHotkey 可以模拟键击和鼠标点击. 然而由于 Windows API 的特性, 按下 <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd> 将重新启用输入.</p>
<p><a href="_UseHook.htm">钩子热键</a>的某些类型在 BlockInput 启用时仍然可以被触发. 例子包括 <code>MButton</code>(鼠标钩子) 和 <code>LWin &amp; Space</code>(含有除修饰符<code>$#</code>外的明确前缀的键盘钩子).</p>
<p>当脚本关闭时会自动重新启用输入.</p>
<h2 id="Related">相关</h2>
<p><a href="SendMode.htm">SendMode</a>, <a href="Send.htm">Send</a>, <a href="Click.htm">Click</a>, <a href="MouseMove.htm">MouseMove</a>, <a href="MouseClick.htm">MouseClick</a>, <a href="MouseClickDrag.htm">MouseClickDrag</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a class="ex_number" href="#ExBasic"></a> 打开记事本, 并在 BlockInput 开启时通过发送 F5 粘贴时间/日期. 注意, BlockInput 可能只在脚本以管理员身份运行的情况下工作.</p>
<pre>BlockInput, On
Run, notepad
WinWaitActive, Untitled - Notepad
Send, {F5} <em>; 粘贴时间和日期</em>
BlockInput, Off</pre>
</div>

</body>
</html>